"""
Author: Yishang
Description: 判断文件是否有效等
"""
import os
import time

import xlrd
import openpyxl
import PyPDF2
from docx import Document
import zipfile
import platform

from io import BytesIO


def check_file(file_io: BytesIO, url=None) -> dict:
    """
    自动检查文件是否有效。

    :param file_io: 文件IO
    :param url: 网址，如果有传入网址，先按照网址判断
    :return: 字典，is_valid 是否有效  is_encrypted 是否加密
    """
    return {
        'is_valid': True,
        'is_encrypted': False,
    }


def check_pdf_validity(file_io: BytesIO) -> dict:
    """
    检查PDF文件是否有效、未加密。

    :param file_io: 文件IO
    :return:
    """
    result = {
        "is_valid": False,
        "is_encrypted": False
    }

    try:
        # 尝试读取PDF文件
        pdf_reader = PyPDF2.PdfReader(file_io)

        # 检查文件是否加密
        if pdf_reader.is_encrypted:
            result["is_encrypted"] = True
            # 若加密，则尝试解密（空密码）
            if pdf_reader.decrypt("") == 0:
                result["is_valid"] = False
                return result
        result["is_valid"] = True
    except BaseException as e:
        result["is_valid"] = False

    return result


def check_xls_validity(file_io: BytesIO) -> dict:
    """
    检查xls文件是否有效、未加密。

    :param file_io: 文件IO
    :return: 包含文件有效性和加密状态的字典
    """
    file_io.seek(0)

    result = {
        "is_valid": False,
        "is_encrypted": False
    }

    try:
        # 尝试加载xls文件
        workbook = xlrd.open_workbook(file_contents=file_io.read())
        result["is_valid"] = True

    except xlrd.biffh.XLRDError as e:
        # 如果文件被加密或格式无效，XLRDError会被触发
        if "encrypted" in str(e).lower():
            result["is_encrypted"] = True
        else:
            result["is_valid"] = False

    except Exception:
        # 其他异常代表文件无效
        result["is_valid"] = False

    return result


def check_xlsx_validity(file_io: BytesIO) -> dict:
    """
    检查Excel文件是否有效、未加密。

    :param file_io: 文件IO
    :return: 包含文件有效性和加密状态的字典
    """
    file_io.seek(0)

    result = {
        "is_valid": False,
        "is_encrypted": False
    }

    try:
        # 尝试加载Excel文件
        workbook = openpyxl.load_workbook(file_io)
        # 访问一个工作表验证是否可读
        sheet = workbook.active
        result["is_valid"] = True

    except openpyxl.utils.exceptions.InvalidFileException:
        # 如果文件格式无效
        result["is_valid"] = False

    except KeyError:
        # 如果文件被加密或存在其他访问限制
        result["is_encrypted"] = True

    except Exception:
        # 捕获其他异常
        result["is_valid"] = False

    return result
